package Day_0219.JavaBase;

/**
 * @author zxc
 * @date 2023/02/19 08:38
 **/
public class String_StringBuilder_StringBuffer {
    public static void main(String[] args) {
        /**
         * String, StringBuffer和StringBuilder区别
         * ===》
         * 1.String是字符串常量，final修饰（不可变）
         * 2.StringBuffer是字符串变量(可变 && 线程安全)；
         * 3.StringBuilder 字符串变量(可变线程不安全)。
         *
         * 4.String和StringBuffer
         * 1）String和StringBuffer主要区别是性能：
         *  String是不可变对象，每次对String类型进行操作，都等同于产生了一个新的String对象，然后指向新的String对象。
         *  所以尽量不在对String进行大量的拼接操作，否则会产生很多临时对象，导致GC开始工作，影响系统性能。
         * 2）StringBuffer是对 对象本身操作，而不是产生新的对象，
         *  因此在有大量拼接的情况下，我们建议使用StringBuffer。
         * ===》
         * 但是需要注意现在JVM会对String拼接做一定的优化：
         * String s=“This is only ”+”simple”+”test”会被虚拟机直接优化成String s=“This is only simple test”，
         * 此时就不存在拼接过程。
         *
         * 5.StringBuffer和StringBuilder
         * 1）StringBuffer是线程安全的可变字符串，其内部实现是可变数组。
         * 2）StringBuilder是jdk 1.5新增的，其功能和StringBuffer类似，但是非线程安全。
         * 因此，在没有多线程问题的前提下，使用StringBuilder会取得更好的性能。
         *
         * 6.String和StringBuffer、StringBuilder的区别是什么？String为什么是不可变的
         * ===》
         * 1）可变性
         * （1）String类中使用字符数组保存字符串，
         *  private final char value[]，所以string对象是不可变的。
         * （2）StringBuilder与StringBuffer都继承自AbstractStringBuilder类，
         *  在AbstractStringBuilder中，也是使用字符数组保存字符串，char[] value，这两种对象都是可变的。
         *
         * 2）线程安全性
         * （1）String中的对象是不可变的，也就可以理解为常量，线程安全。（字符串常量）
         * （2）AbstractStringBuilder是StringBuilder与StringBuffer的公共父类，定义了一些字符串的基本操作，
         *  如expandCapacity、append、insert、indexOf等公共方法。
         * （3）StringBuffer ：对方法加了同步锁或者对调用的方法加了同步锁，所以是线程安全的。
         * （4）StringBuilder ：并没有对方法进行加同步锁，所以是非线程安全的。
         *
         * 3）性能
         * （1）每次对String 类型进行改变的时候，都会生成一个新的String对象，然后将指针指向新的String 对象。
         * （由于每次对于String类型的字符串常量进行修改，都会生成一个新的String对象，所以消耗性能大;）
         * （2）StringBuffer每次都会对StringBuffer对象本身进行操作，而不是生成新的对象并改变对象引用。
         *  相同情况下使用StringBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升，但却要冒多线程不安全的风险。
         * （3）由于StringBuffer对于调用方法加上了同步锁，所以消耗性能高于 不加同步锁的StringBuilder
         *
         * ===》
         * 对于三者使用的总结
         * （1）如果要操作少量的数据用 = String
         * （2）单线程操作字符串缓冲区 下，操作大量数据 = StringBuilder（追求性能）
         * （3）多线程操作字符串缓冲区 下操作大量数据 = StringBuffer（保证线程安全）
         *
         *
         */
    }
}
